{
OstreeDaemon *self = user_data;
GError *error = NULL;
- char *repo_path;
+ GFile *repo_file = NULL;
- repo_path = g_build_filename (ot_gfile_get_path_cached (self->prefix), "repo", NULL);
- self->repo = ostree_repo_new (repo_path);
- g_free (repo_path);
+ repo_file = g_file_get_child (self->prefix, "repo");
+ self->repo = ostree_repo_new (repo_file);
+ g_clear_object (&repo_file);
if (!ostree_repo_check (self->repo, &error))
{
g_printerr ("%s\n", error->message);
typedef struct _OstreeRepoPrivate OstreeRepoPrivate;
struct _OstreeRepoPrivate {
- char *path;
- GFile *repo_file;
+ GFile *repodir;
GFile *tmp_dir;
GFile *local_heads_dir;
GFile *remote_heads_dir;
- char *objects_path;
- char *config_path;
+ GFile *objects_dir;
+ GFile *config_file;
gboolean inited;
gboolean in_transaction;
OstreeRepo *self = OSTREE_REPO (object);
OstreeRepoPrivate *priv = GET_PRIVATE (self);
- g_free (priv->path);
- g_clear_object (&priv->repo_file);
+ g_clear_object (&priv->repodir);
g_clear_object (&priv->tmp_dir);
g_clear_object (&priv->local_heads_dir);
g_clear_object (&priv->remote_heads_dir);
- g_free (priv->objects_path);
- g_free (priv->config_path);
+ g_clear_object (&priv->objects_dir);
+ g_clear_object (&priv->config_file);
g_hash_table_destroy (priv->pending_transaction_tmpfiles);
if (priv->config)
g_key_file_free (priv->config);
switch (prop_id)
{
case PROP_PATH:
- priv->path = g_value_dup_string (value);
+ /* Canonicalize */
+ priv->repodir = ot_gfile_new_for_path (g_file_get_path (g_value_get_object (value)));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
switch (prop_id)
{
case PROP_PATH:
- g_value_set_string (value, priv->path);
+ g_value_set_object (value, priv->repodir);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
priv = GET_PRIVATE (object);
- g_assert (priv->path != NULL);
+ g_assert (priv->repodir != NULL);
- priv->repo_file = ot_gfile_new_for_path (priv->path);
- priv->tmp_dir = g_file_resolve_relative_path (priv->repo_file, "tmp");
- priv->local_heads_dir = g_file_resolve_relative_path (priv->repo_file, "refs/heads");
- priv->remote_heads_dir = g_file_resolve_relative_path (priv->repo_file, "refs/remotes");
+ priv->tmp_dir = g_file_resolve_relative_path (priv->repodir, "tmp");
+ priv->local_heads_dir = g_file_resolve_relative_path (priv->repodir, "refs/heads");
+ priv->remote_heads_dir = g_file_resolve_relative_path (priv->repodir, "refs/remotes");
- priv->objects_path = g_build_filename (priv->path, "objects", NULL);
- priv->config_path = g_build_filename (priv->path, "config", NULL);
+ priv->objects_dir = g_file_get_child (priv->repodir, "objects");
+ priv->config_file = g_file_get_child (priv->repodir, "config");
return object;
}
g_object_class_install_property (object_class,
PROP_PATH,
- g_param_spec_string ("path",
+ g_param_spec_object ("path",
"",
"",
- NULL,
+ G_TYPE_FILE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
}
}
OstreeRepo*
-ostree_repo_new (const char *path)
+ostree_repo_new (GFile *path)
{
return g_object_new (OSTREE_TYPE_REPO, "path", path, NULL);
}
g_return_val_if_fail (priv->inited, FALSE);
data = g_key_file_to_data (new_config, &len, error);
- if (!g_file_set_contents (priv->config_path, data, len, error))
+ if (!g_file_replace_contents (priv->config_file, data, len, NULL, FALSE, 0, NULL,
+ NULL, error))
goto out;
g_key_file_free (priv->config);
if (priv->inited)
return TRUE;
- if (!g_file_test (priv->objects_path, G_FILE_TEST_IS_DIR))
+ if (!g_file_test (ot_gfile_get_path_cached (priv->objects_dir), G_FILE_TEST_IS_DIR))
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Couldn't find objects directory '%s'", priv->objects_path);
+ "Couldn't find objects directory '%s'",
+ ot_gfile_get_path_cached (priv->objects_dir));
goto out;
}
priv->config = g_key_file_new ();
- if (!g_key_file_load_from_file (priv->config, priv->config_path, 0, error))
+ if (!g_key_file_load_from_file (priv->config, ot_gfile_get_path_cached (priv->config_file), 0, error))
{
g_prefix_error (error, "Couldn't parse config file: ");
goto out;
return ret;
}
-const char *
+GFile *
ostree_repo_get_path (OstreeRepo *self)
{
OstreeRepoPrivate *priv = GET_PRIVATE (self);
- return priv->path;
+ return priv->repodir;
}
GFile *
OstreeObjectType type)
{
OstreeRepoPrivate *priv = GET_PRIVATE (self);
- char *path;
char *relpath;
GFile *ret;
relpath = ostree_get_relative_object_path (checksum, type);
- path = g_build_filename (priv->path, relpath, NULL);
+ ret = g_file_resolve_relative_path (priv->repodir, relpath);
g_free (relpath);
- ret = ot_gfile_new_for_path (path);
- g_free (path);
return ret;
}
GError **error)
{
OstreeRepoPrivate *priv = GET_PRIVATE (self);
- GFile *objectdir = NULL;
GFileEnumerator *enumerator = NULL;
gboolean ret = FALSE;
GFileInfo *file_info = NULL;
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
g_return_val_if_fail (priv->inited, FALSE);
- objectdir = ot_gfile_new_for_path (priv->objects_path);
- enumerator = g_file_enumerate_children (objectdir, OSTREE_GIO_FAST_QUERYINFO,
+ enumerator = g_file_enumerate_children (priv->objects_dir, OSTREE_GIO_FAST_QUERYINFO,
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
NULL,
error);
if (strlen (name) == 2 && type == G_FILE_TYPE_DIRECTORY)
{
- GFile *objdir = g_file_get_child (objectdir, name);
+ GFile *objdir = g_file_get_child (priv->objects_dir, name);
if (!iter_object_dir (self, objdir, callback, user_data, error))
{
g_object_unref (objdir);
out:
g_clear_object (&file_info);
g_clear_object (&enumerator);
- g_clear_object (&objectdir);
return ret;
}
GType ostree_repo_get_type (void);
-OstreeRepo* ostree_repo_new (const char *path);
+OstreeRepo* ostree_repo_new (GFile *path);
gboolean ostree_repo_check (OstreeRepo *self, GError **error);
-const char * ostree_repo_get_path (OstreeRepo *self);
+GFile * ostree_repo_get_path (OstreeRepo *self);
typedef enum {
OSTREE_REPO_MODE_BARE,
}
static gboolean
-ostree_builtin_pull (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_pull (int argc, char **argv, GFile *repo_path, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
};
gboolean
-ostree_builtin_checkout (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_checkout (int argc, char **argv, GFile *repo_path, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
}
gboolean
-ostree_builtin_checksum (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_checksum (int argc, char **argv, GFile *repo_path_path, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
};
gboolean
-ostree_builtin_commit (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_commit (int argc, char **argv, GFile *repo_path, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
}
gboolean
-ostree_builtin_compose (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_compose (int argc, char **argv, GFile *repo_path, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
}
gboolean
-ostree_builtin_diff (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_diff (int argc, char **argv, GFile *repo_path, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
}
gboolean
-ostree_builtin_fsck (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_fsck (int argc, char **argv, GFile *repo_path, GError **error)
{
GOptionContext *context;
OtFsckData data;
gboolean
-ostree_builtin_init (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_init (int argc, char **argv, GFile *repo_path, GError **error)
{
GOptionContext *context = NULL;
gboolean ret = FALSE;
- GFile *repodir = NULL;
GFile *child = NULL;
GFile *grandchild = NULL;
GString *config_data = NULL;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repodir = ot_gfile_new_for_path (repo_path);
-
- child = g_file_get_child (repodir, "config");
+ child = g_file_get_child (repo_path, "config");
config_data = g_string_new (DEFAULT_CONFIG_CONTENTS);
g_string_append_printf (config_data, "mode=%s\n", archive ? "archive" : "bare");
goto out;
g_clear_object (&child);
- child = g_file_get_child (repodir, "objects");
+ child = g_file_get_child (repo_path, "objects");
if (!g_file_make_directory (child, NULL, error))
goto out;
g_clear_object (&child);
- child = g_file_get_child (repodir, "tmp");
+ child = g_file_get_child (repo_path, "tmp");
if (!g_file_make_directory (child, NULL, error))
goto out;
g_clear_object (&child);
- child = g_file_get_child (repodir, "refs");
+ child = g_file_get_child (repo_path, "refs");
if (!g_file_make_directory (child, NULL, error))
goto out;
g_clear_object (&child);
- child = g_file_get_child (repodir, "tags");
+ child = g_file_get_child (repo_path, "tags");
if (!g_file_make_directory (child, NULL, error))
goto out;
g_clear_object (&child);
g_option_context_free (context);
if (config_data)
g_string_free (config_data, TRUE);
- g_clear_object (&repodir);
g_clear_object (&child);
g_clear_object (&grandchild);
return ret;
}
gboolean
-ostree_builtin_local_clone (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_local_clone (int argc, char **argv, GFile *repo_path, GError **error)
{
gboolean ret = FALSE;
GOptionContext *context;
const char *destination;
+ GFile *dest_f = NULL;
OtLocalCloneData data;
GFile *src_repo_dir = NULL;
GFile *dest_repo_dir = NULL;
}
destination = argv[1];
+ dest_f = ot_gfile_new_for_path (destination);
- data.dest_repo = ostree_repo_new (destination);
+ data.dest_repo = ostree_repo_new (dest_f);
if (!ostree_repo_check (data.dest_repo, error))
goto out;
- src_repo_dir = ot_gfile_new_for_path (ostree_repo_get_path (data.src_repo));
- dest_repo_dir = ot_gfile_new_for_path (ostree_repo_get_path (data.dest_repo));
+ src_repo_dir = g_object_ref (ostree_repo_get_path (data.src_repo));
+ dest_repo_dir = g_object_ref (ostree_repo_get_path (data.dest_repo));
src_info = g_file_query_info (src_repo_dir, OSTREE_GIO_FAST_QUERYINFO,
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
out:
if (context)
g_option_context_free (context);
+ g_clear_object (&dest_f);
g_clear_object (&src_repo_dir);
g_clear_object (&dest_repo_dir);
g_clear_object (&src_info);
};
gboolean
-ostree_builtin_log (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_log (int argc, char **argv, GFile *repo_path, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
}
gboolean
-ostree_builtin_ls (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_ls (int argc, char **argv, GFile *repo_path, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
}
gboolean
-ostree_builtin_remote (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_remote (int argc, char **argv, GFile *repo_path, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
};
gboolean
-ostree_builtin_rev_parse (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_rev_parse (int argc, char **argv, GFile *repo_path, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
};
gboolean
-ostree_builtin_run_triggers (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_run_triggers (int argc, char **argv, GFile *repo_path, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
}
gboolean
-ostree_builtin_show (int argc, char **argv, const char *repo_path, GError **error)
+ostree_builtin_show (int argc, char **argv, GFile *repo_path, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
#ifndef __OSTREE_BUILTINS__
#define __OSTREE_BUILTINS__
-#include <glib-object.h>
+#include <gio/gio.h>
G_BEGIN_DECLS
-gboolean ostree_builtin_checkout (int argc, char **argv, const char *repo, GError **error);
-gboolean ostree_builtin_checksum (int argc, char **argv, const char *repo, GError **error);
-gboolean ostree_builtin_commit (int argc, char **argv, const char *repo, GError **error);
-gboolean ostree_builtin_compose (int argc, char **argv, const char *repo, GError **error);
-gboolean ostree_builtin_diff (int argc, char **argv, const char *repo, GError **error);
-gboolean ostree_builtin_init (int argc, char **argv, const char *repo, GError **error);
-gboolean ostree_builtin_local_clone (int argc, char **argv, const char *repo, GError **error);
-gboolean ostree_builtin_log (int argc, char **argv, const char *repo, GError **error);
-gboolean ostree_builtin_ls (int argc, char **argv, const char *repo, GError **error);
-gboolean ostree_builtin_run_triggers (int argc, char **argv, const char *repo, GError **error);
-gboolean ostree_builtin_fsck (int argc, char **argv, const char *repo, GError **error);
-gboolean ostree_builtin_show (int argc, char **argv, const char *repo, GError **error);
-gboolean ostree_builtin_rev_parse (int argc, char **argv, const char *repo, GError **error);
-gboolean ostree_builtin_remote (int argc, char **argv, const char *repo, GError **error);
+gboolean ostree_builtin_checkout (int argc, char **argv, GFile *repo_path, GError **error);
+gboolean ostree_builtin_checksum (int argc, char **argv, GFile *repo_path, GError **error);
+gboolean ostree_builtin_commit (int argc, char **argv, GFile *repo_path, GError **error);
+gboolean ostree_builtin_compose (int argc, char **argv, GFile *repo_path, GError **error);
+gboolean ostree_builtin_diff (int argc, char **argv, GFile *repo_path, GError **error);
+gboolean ostree_builtin_init (int argc, char **argv, GFile *repo_path, GError **error);
+gboolean ostree_builtin_local_clone (int argc, char **argv, GFile *repo_path, GError **error);
+gboolean ostree_builtin_log (int argc, char **argv, GFile *repo_path, GError **error);
+gboolean ostree_builtin_ls (int argc, char **argv, GFile *repo_path, GError **error);
+gboolean ostree_builtin_run_triggers (int argc, char **argv, GFile *repo_path, GError **error);
+gboolean ostree_builtin_fsck (int argc, char **argv, GFile *repo_path, GError **error);
+gboolean ostree_builtin_show (int argc, char **argv, GFile *repo_path, GError **error);
+gboolean ostree_builtin_rev_parse (int argc, char **argv, GFile *repo_path, GError **error);
+gboolean ostree_builtin_remote (int argc, char **argv, GFile *repo_path, GError **error);
G_END_DECLS
#include <string.h>
#include "ot-main.h"
+#include "otutil.h"
static int
usage (char **argv, OstreeBuiltin *builtins, gboolean is_error)
gboolean have_repo_arg;
const char *cmd = NULL;
const char *repo = NULL;
+ GFile *repo_file = NULL;
int arg_off;
g_type_init ();
else
repo = NULL;
+ if (repo)
+ repo_file = ot_gfile_new_for_path (repo);
+
cmd = strchr (argv[0], '-');
if (cmd)
{
prep_builtin_argv (cmd, argc-arg_off, argv+arg_off, &cmd_argc, &cmd_argv);
- if (!builtin->fn (cmd_argc, cmd_argv, repo, &error))
+ if (!builtin->fn (cmd_argc, cmd_argv, repo_file, &error))
goto out;
out:
g_free (cmd_argv);
+ g_clear_object (&repo_file);
if (error)
{
g_printerr ("%s\n", error->message);
typedef struct {
const char *name;
- gboolean (*fn) (int argc, char **argv, const char *repo, GError **error);
+ gboolean (*fn) (int argc, char **argv, GFile *repo_path, GError **error);
int flags; /* OstreeBuiltinFlags */
} OstreeBuiltin;